package com.third.device.mg.serialport.factory.autorail.product

import com.third.device.mg.serialport.factory.autorail.BaseAutorailsProduct
import com.third.device.mg.serialport.utils.to2ByteL

/**
 * @Date 2022/2/12
 * Description:
 */
class DreamCurtain : BaseAutorailsProduct() {
    override fun productDescribe(): String =
        "广州市奥特威电机有限公司 - 广州市白云区竹料大道西3号 - www.autorail.cn - 梦幻帘(彩虹帘)"


    /**
     * 设置id
     * 设备ID为大端模式，低位在前，高位在后
     * 执行写设备地址前，先按住电机设置键 5 秒，等蜂鸣两次后之后松开按键，成功后电机会转动提示。
     * @param id 大端模式 低位在前，高位在后   高低位均不能为 0x00 和 0xFF
     * 默认地址为 0xFEFE（恢复出厂设置）
     * 0x0000 == >> 0
     * 0x00FF == >> 255
     * 0xFF00 == >> 65280
     * 0xFFFF == >> 0
     */
    fun setDeviceId(id: ByteArray): ByteArray {
        val command = byteArrayOf(
            0x55,
            0,
            0,
            WRITE_MODE,
            0,
            0x02,
            id[0],
            id[1]
        )
        return crcCheck(command)
    }

    /**
     * 设置角度系数
     * @param coefficient 角度系数 0~255
     */
    fun setAngleCoefficient(id: ByteArray, coefficient: Short): ByteArray {
        val command = byteArrayOf(
            0x55,
            id[0],
            id[1],
            WRITE_MODE,
            0x08,
            0x01,
            coefficient.toByte()
        )
        return crcCheck(command)
    }

    /**
     * 设置角度
     * @param angle 角度 0 ~ 180
     */
    fun setAngle(id: ByteArray, angle: Short): ByteArray {
        val command = byteArrayOf(
            0x55,
            id[0],
            id[1],
            CONTROL_MODE,
            0x04,
            0xFF.toByte(),
            angle.toByte()
        )
        return crcCheck(command)
    }

    /**
     *
     * 设置运行位置以及角度
     */
    fun setPercentAndAngle(id: ByteArray,percent: Int, angle: Short): ByteArray {
        val command = byteArrayOf(
            0x55,
            id[0],
            id[1],
            CONTROL_MODE,
            0x04,
            percent.to2ByteL()[0],
            angle.toByte()
        )
        return crcCheck(command)
    }


    /**
     * 设置设备的方向
     * @param isDefault true:默认方向  false:反方向
     */
    fun setDeviceDirection(id: ByteArray, isDefault: Boolean): ByteArray {
        val command = byteArrayOf(
            0x55,
            id[0],
            id[1],
            WRITE_MODE,
            0x03,
            0x01,
            if (isDefault) 0 else 1
        )
        return crcCheck(command)
    }

    /**
     * 控制命令-打开
     */
    fun on(id: ByteArray): ByteArray {
        val command = byteArrayOf(
            0x55,
            id[0],
            id[1],
            CONTROL_MODE,
            0x01
        )
        return crcCheck(command)
    }


    /**
     * 控制命令-关闭
     */
    fun off(id: ByteArray): ByteArray {
        val command = byteArrayOf(
            0x55,
            id[0],
            id[1],
            CONTROL_MODE,
            0x02
        )
        return crcCheck(command)
    }


    /**
     * 控制命令-关闭
     */
    fun stop(id: ByteArray): ByteArray {
        val command = byteArrayOf(
            0x55,
            id[0],
            id[1],
            CONTROL_MODE,
            0x03
        )
        return crcCheck(command)
    }


    /**
     * 运行至百分比
     */
    fun runPercent(id: ByteArray, percent: Int): ByteArray {
        val command = byteArrayOf(
            0x55,
            id[0],
            id[1],
            CONTROL_MODE,
            0x04,
            percent.to2ByteL()[0]
        )
        return crcCheck(command)
    }

    /**
     * 读取百分比
     */
    fun readPercent(id: ByteArray): ByteArray {
        val command = byteArrayOf(
            0x55,
            id[0],
            id[1],
            READ_MODE,
            0x02,
            0x01
        )
        return crcCheck(command)
    }

    /**
     * 读取方向状态
     */
    fun readDirection(id: ByteArray): ByteArray {
        val command = byteArrayOf(
            0x55,
            id[0],
            id[1],
            READ_MODE,
            0x03,
            0x01
        )
        return crcCheck(command)
    }

    /**
     * 读取设备类型
     */
    fun readDeviceType(id: ByteArray): ByteArray {
        val command = byteArrayOf(
            0x55,
            id[0],
            id[1],
            READ_MODE,
            0xF0.toByte(),
            0x01
        )
        return crcCheck(command)
    }

    /**
     * 读取所有信息
     */
    fun readAngle(id: ByteArray): ByteArray {
        val command = byteArrayOf(
            0x55,
            id[0],
            id[1],
            READ_MODE,
            0x06,
            0x01
        )
        return crcCheck(command)
    }

    /**
     * 读取当前角度系数
     */
    fun readAngleCoefficient(id: ByteArray): ByteArray {
        val command = byteArrayOf(
            0x55,
            id[0],
            id[1],
            READ_MODE,
            0x08,
            0x01
        )
        return crcCheck(command)
    }
}